#pragma once

#include  "iostream"
#include  "vector"
#include "unordered_set"
#include  "stack"
#include  "unordered_map"
#include   "queue"
#include <cmath>

using namespace std;

/*
 * 编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为：

对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1，那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ；不是，则返回 false 。



示例 1：

输入：n = 19
输出：true
解释：
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
 *
 *
 *
 * */
//我这玩意诈胡 todo 真正还是得看题解
// 这个东西如果不等于1 就必定存在环 暂时不能证明因为自己不会
bool isHappy(int n) {
    int count = 0;
    int res = 0;
    while (count < 6) {
        res = 0;

        while (n != 0) {
            auto left = n % 10;
            n /= 10;
            res += pow(left, 2);
        }
        if (res == 1)
            return true;
        n = res;
        count++;
    }


    return false;
}


int getNext(int n) {
    int totalSum = 0;
    while (n > 0) {
        int d = n % 10;
        n = n / 10;
        totalSum += d * d;
    }
    return totalSum;
}

//我把这俩写到一个函数里面了导致n相同每次判断都包含导致出错....
bool isHappy1(int n) {
    unordered_set<int> st;
    while (st.count(n) <= 0 && n != 1) {
        st.insert(n);
        n = getNext(n);
    }


    return n == 1;
}